#!/usr/bin/env python
# encoding: utf-8
'''
@author: Excelsiorly
@license: (C) Copyright 2022, All Rights Reserved.
@contact: excelsiorly@qq.com
@file: 662. 二叉树最大宽度.py
@time: 2022/3/4 14:08
@desc: https://leetcode-cn.com/problems/maximum-width-of-binary-tree/
> 给定一个二叉树，编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树（full binary tree）结构相同，但一些节点为空。
每一层的宽度被定义为两个端点（该层最左和最右的非空节点，两端点间的null节点也计入长度）之间的长度。
示例 1:
输入:

           1
         /   \
        3     2
       / \     \
      5   3     9

输出: 4
解释: 最大值出现在树的第 3 层，宽度为 4 (5,3,null,9)。

1. dfs, Ot(N), Os(N)
'''
# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
class Solution:
    def widthOfBinaryTree(self, root: Optional[TreeNode]) -> int:
        self.ans = 0
        left = {}
        def dfs(node, depth, pos):
            if node:
                # 记录本层最左边的位置
                if not depth in left: left[depth] = pos
                self.ans = max(self.ans, pos-left[depth]+1)
                dfs(node.left, depth+1, pos*2)
                dfs(node.right, depth+1, pos*2+1)
        dfs(root, 0, 0)
        return self.ans

if __name__ == '__main__':
    root = TreeNode(1, left=TreeNode(3, left=TreeNode(5), right=TreeNode(3)), right=TreeNode(2, right=TreeNode(3)))
    res = Solution().widthOfBinaryTree(root)
    print(res)